﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SistemaFacturacion.Entidades;
using System.Collections;

namespace SistemaFacturacion
{
    public class ExternInvoiceManager
    {
        #region Atributos
        private static ExternInvoiceManager _Instance;
        private Hashtable _ItemsDetail;
        private bool _IsError;
        private String _ErrorMessage;
        #endregion

        #region Constructor singleton
        /// <summary>
        /// Constructo privado de la clase
        /// </summary>
        private ExternInvoiceManager()
        {
            _ItemsDetail = new Hashtable();
            _IsError = false;
            _ErrorMessage = "";
        }

        /// <summary>
        /// Método que devuelve la instancia si ya ha sido creada sino hace una nueva
        /// </summary>
        /// <returns></returns>
        public static ExternInvoiceManager GetInstance()
        {
            if (_Instance == null)
                _Instance = new ExternInvoiceManager();
            return _Instance;
        }
        #endregion

        #region Propiedades
        /// <summary>
        /// Devuelve si hubo o no error
        /// </summary>
        public bool IsError
        {
            get { return _IsError; }
        }

        /// <summary>
        /// Devuelve el mensaje de error
        /// </summary>
        public String ErrorMessage
        {
            get { return _ErrorMessage; }
            set { _ErrorMessage = value; }
        }
        #endregion

        #region Métodos Públicos
        /// <summary>
        /// Método que se encarga de guardar un item en la lista de items agregados
        /// </summary>
        /// <param name="item">Objeto item a guardar</param>
        /// <returns>Si tuvo éxito o no la operación</returns>
        public bool AddNewItem(DocDetail item)
        {
            if (_ItemsDetail.ContainsKey(item.ItemCode))
            {
                _IsError = true;
                _ErrorMessage = Constants.ERROR_ITEM_BAD_ADD;
                return false;
            }

            _ItemsDetail.Add(item.ItemCode, item);

            return true;
        }

        /// <summary>
        /// Retorna una lista de los items que se encuentran en memoria
        /// </summary>
        /// <returns></returns>
        public List<DocDetail> GetDocItems()
        {
            if (_ItemsDetail == null)
            {
                _IsError = true;
                _ErrorMessage = "Error al intentar acceder a la lista de artículos agregados";
                return null;
            }
            List<DocDetail> items = new List<DocDetail>();
            foreach (DocDetail detail in _ItemsDetail.Values)
            {
                items.Add(detail);
            }
            return items;
        }

        /// <summary>
        /// Método que se encarga de eliminar un ítem por medio de su código
        /// de la lista de agregados al detalle de un documento
        /// </summary>
        /// <param name="itemCode">Código del item a eliminar</param>
        /// <returns>si la operación tuvo éxito o no</returns>
        public bool DeleteItem(String itemCode)
        {
            if (_ItemsDetail.ContainsKey(itemCode))
            {
                _ItemsDetail.Remove(itemCode);
                return true;
            }
            _IsError = true;
            _ErrorMessage = Constants.ERROR_ITEM_BAD_DELETE;
            return false;
        }

        /// <summary>
        /// Método que se encarga de llamar a guardar el documento al archivo xml
        /// </summary>
        /// <param name="document"></param>
        /// <returns></returns>
        public bool SaveInvoice(Document document, String filePath)
        {
            document.Detail = this.GetDocItems();
            // Aquí llamo al método de escribri en el archivo xml
            XmlManager xmlManager = new XmlManager();
            bool noError = xmlManager.SaveInvoice(document, filePath);
            if (!noError)
            {
                _IsError = true;
                _ErrorMessage = Constants.ERROR_DOC_SAVE_XML_FAIL;
                return false;
            }
            _ItemsDetail = new Hashtable();
            return true;
        }
        #endregion
    }
}
